home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.45 / amigaprotect / amigaprotect.p < prev    next >
Text File  |  1995-03-02  |  7KB  |  281 lines

  1. PROGRAM AmigaProtect;
  2.  
  3. { Simples, aber doch effektives Programm zum Schützen seines
  4.   eigenen Rechners vor ungewollten Zugriffen.
  5.   
  6.   Dieses Programm ist GIFTWARE !!
  7.   
  8.   ©1995 by Björn Schotte (BOMBERSOFT)                         }
  9.   
  10. USES Intuition, Graphics, Exec;
  11.  
  12. {$incl "dos.lib"}
  13.  
  14. CONST
  15. {  DEBUGGING = 1;}
  16.   
  17.   logfile = "ENVARC:AmigaProtect/logfile";
  18.   passwd  = "ENVARC:AmigaProtect/passwds";
  19.   
  20. TYPE
  21.   userrec = RECORD
  22.     username,
  23.      passwd   : STRING;
  24.   END;
  25.     
  26. VAR
  27.   ps    : p_Screen; STATIC;
  28.   wp    : p_Window; STATIC;
  29.   modes,x,y,b,h,anz,i : LONG; STATIC;
  30.   rp : p_RastPort; STATIC;
  31.   t     : ARRAY[1..8] OF TagItem; STATIC;
  32.   ok    : BOOLEAN; STATIC;
  33.   pattern: ARRAY[0..1] OF WORD; STATIC;
  34.   f : TEXT; STATIC;
  35.   machinename,s,s1,usern,passw,
  36.   datum,zeit : STRING; STATIC;
  37.   user : ARRAY[1..20] OF userrec; STATIC;
  38.   msg : p_IntuiMessage; STATIC;
  39.   class,code : LONG; STATIC;
  40.   versuch : BYTE; STATIC;
  41.   std,min,sek : BYTE; STATIC;
  42.  
  43. PROCEDURE Upper(VAR s : STRING);
  44. BEGIN
  45.   FOR i := 1 TO Length(s) DO s[i] := UpCase(s[i]);
  46. END;
  47.  
  48. PROCEDURE OpenLogFile;
  49. BEGIN
  50.   Reset(f,logfile);
  51.   IF IOResult <> 0 THEN ReWrite(f, logfile) ELSE Seek(f,filesize(f));
  52.   IF IOResult <> 0 THEN Error("Kann die LogDatei nicht anlegen!!");
  53. END;
  54.  
  55. PROCEDURE uhrzeit(VAR stunden,minuten,sekunden:Byte);
  56. VAR zeit : DATESTAMP;
  57.     xx   : p_DateStamp;
  58. BEGIN
  59.   xx := _DATESTAMP(^zeit);
  60.   stunden := zeit.ds_minute DIV 60;
  61.   minuten := zeit.ds_minute MOD 60;
  62.   sekunden:= zeit.ds_tick DIV 50;
  63. END;
  64.  
  65. FUNCTION  OS2_Datum : STRING;
  66. VAR
  67.   s,s1 : STRING;
  68.   x : LONGINT;
  69.   dummydate : ^DATESTAMP;
  70.   datedatum : DATESTAMP;
  71.   DT : DateTime;
  72. BEGIN
  73.   DummyDate := DOSDateStamp(^DateDatum);
  74.   DT := DateTime(DateDatum,FORMAT_DOS,0,NIL,^s,NIL);
  75.   x := DateToStr(^DT);
  76.   s1 := DT.dat_StrDate;
  77.   OS2_Datum := s1;
  78. END;
  79.  
  80. PROCEDURE GetDates;
  81. VAR st,mi,se : STRING;
  82. BEGIN
  83.   uhrzeit(std,min,sek);
  84.   st := IntStr(std); mi:=IntStr(min); se := IntStr(sek);
  85.   IF std < 10 THEN st := "0"+st;
  86.   IF min < 10 THEN mi := "0"+mi;
  87.   IF sek < 10 THEN se := "0"+se;
  88.   zeit := st+":"+mi+":"+se;
  89.   datum := OS2_Datum;
  90. END;
  91.  
  92. PROCEDURE ReadInPassWds;
  93. BEGIN
  94.   s := "Kann "+passwd+" nicht öffnen!";
  95.   Reset(f, passwd);
  96.   IF IOResult <> 0 THEN
  97.     Error(s);
  98.   Buffer(f, 10000);
  99.   ReadLn(f, machinename);
  100.   anz := 0;
  101.   WHILE NOT EOF(f) DO
  102.   BEGIN
  103.      Inc(anz);
  104.      ReadLn(f, user[anz].username);
  105.      Upper(user[anz].username);
  106.      Readln(f, user[anz].passwd);
  107.      Upper(user[anz].passwd);
  108.   END;
  109.   Close(f);
  110. {$if def DEBUGGING}
  111.   Writeln("Maschinenname: ",machinename);
  112.   Writeln(anz:3," User");
  113. {$endif}
  114. END;
  115.  
  116. PROCEDURE clone;
  117. BEGIN
  118.   ps := LockPubScreen(NIL);
  119.   IF ps = NIL THEN Error("Kann den Workbenchscreen nicht locken!");
  120. END;
  121.  
  122. PROCEDURE SetAfPt(w:p_RastPort;p:Ptr;n:Integer);
  123. BEGIN
  124.  w^.AreaPtrn:=p;
  125.  w^.AreaPtSz:=n;
  126. END;
  127.  
  128. PROCEDURE Hintergrund;
  129. BEGIN
  130.   x := wp^.BorderLeft+1;
  131.   y := wp^.BorderTop+1;
  132.   b := wp^.Width-wp^.BorderRight-1;
  133.   h := wp^.Height-wp^.BorderBottom-1;
  134.   pattern[0]:=$AAAA;                { Pattern ausfüllen    }
  135.   pattern[1]:=$5555;
  136.   SetAfPt(RP,^pattern,1);           { Pattern setzen       }
  137.   SetAPen(RP,1);                    { Farben für Raster    } 
  138.   SetBPen(RP,0);
  139.   SetDrMd(RP,JAM2);                 { Schreibmodus setzen  }
  140.   RectFill(RP,x,y,b,h);
  141.   SetAfPt(RP,NIL,0);                { Pattern zurücksetzen }
  142. END;
  143.  
  144. PROCEDURE SchreibeStuff;
  145. VAR
  146.   it,it1,it2 : IntuiText;
  147.   tattr : TextAttr;
  148.   s2 : STRING;
  149. BEGIN
  150.   tattr := TextAttr("topaz.font",8,FSF_BOLD,0);
  151.   it := IntuiText(3,0,JAM2,0,0,^tattr,machinename,NIL);
  152.   PrintIText(rp,^it,(wp^.Width-IntuiTextLength(^it)) DIV 2,wp^.BorderTop+5);
  153.   tattr.ta_Flags := 0;
  154.   s2 :=" Versuch: "+IntStr(versuch);
  155.   it2 := IntuiText(2,0,JAM2,0,20,^tattr,s2,NIL);
  156.   s := "Passwort:";
  157.   FOR i := 1 TO 30 DO s := s + " ";
  158.   it1 := IntuiText(2,0,JAM2,0,10,^tattr,s,^it2);
  159.   s1 := "Username:";
  160.   FOR i := 1 TO 30 DO s1 := s1 + " ";
  161.   it := IntuiText(2,0,JAM2,0,0,^tattr ,s1,^it1);
  162.   PrintIText(rp,^it,wp^.BorderLeft+3,wp^.BorderTop+50);
  163. END;
  164.  
  165. PROCEDURE Abfrage(VAR st:STRING; x,y,maxl:INTEGER; hide:BOOLEAN);
  166. VAR
  167.   it : IntuiText;
  168.   tattr : TextAttr;
  169.   c : CHAR;
  170.   ss : STRING;
  171. BEGIN
  172.   tattr := TextAttr("topaz.font",8,0,0);
  173.   st := "";
  174.   ok := FALSE;
  175.   REPEAT
  176.     msg := p_IntuiMessage(WaitPort(wp^.UserPort));
  177.      msg := p_IntuiMessage(GetMsg(wp^.UserPort));
  178.      WHILE msg <> NIL DO
  179.      BEGIN
  180.         class := msg^.Class;
  181.         code := msg^.Code;
  182.         ReplyMsg(p_Message(msg));
  183.         CASE class OF
  184.           IDCMP_INACTIVEWINDOW : i := ActivateWindow(wp);
  185.           IDCMP_VANILLAKEY:
  186.             BEGIN
  187.                 IF code = 13 THEN ok := TRUE
  188.                 ELSE
  189.                 BEGIN
  190.                   c := CHR(code);
  191.                   IF (Length(st) = maxl) AND NOT (c = CHR(8)) THEN DisplayBeep(NIL)
  192.                   ELSE
  193.                   BEGIN
  194.                       IF c = CHR(8) THEN
  195.                       BEGIN
  196.                          IF st <> "" THEN
  197.                          BEGIN
  198.                             Delete(st,Length(st),1);
  199.                             x := x - 8;
  200.                           it := IntuiText(3,0,JAM2,0,0,^tattr," ",NIL);
  201.                           PrintIText(rp,^it,x,y);
  202.                          END;
  203.                       END ELSE
  204.                       BEGIN
  205.                         st := st + c;
  206.                          IF hide THEN c := "*"
  207.                          ss := c;
  208.                         it := IntuiText(3,0,JAM2,0,0,^tattr,ss,NIL);
  209.                         PrintIText(rp,^it,x,y);
  210.                         x := x + 8;
  211.                       END;
  212.                   END;
  213.                END;
  214.              END;
  215.         ELSE END;
  216.        msg := p_IntuiMessage(GetMsg(wp^.UserPort));
  217.      END;
  218.   UNTIL ok;
  219. END;
  220.  
  221. PROCEDURE win;
  222. LABEL again;
  223. BEGIN
  224.   clone;
  225.   t[1] := TagItem(WA_Flags, WFLG_SMART_REFRESH+
  226.                             WFLG_NOCAREREFRESH+
  227.                                      WFLG_ACTIVATE);
  228.   t[2] := TagItem(WA_IDCMP, IDCMP_VANILLAKEY+
  229.                             IDCMP_INACTIVEWINDOW);
  230.   t[3] := TagItem(WA_Left,(ps^.Width - 400) DIV 2);
  231.   t[4] := TagItem(WA_Top, (ps^.Height - 150) DIV 2);
  232.   t[5] := TagItem(WA_Width, 400);
  233.   t[6] := TagItem(WA_Height, 150);
  234.   t[7].ti_Tag := WA_Title;
  235.   t[7].ti_Data := "AmigaProtect V0.1";
  236.   t[8].ti_Tag := TAG_DONE;
  237.   wp := OpenWindowTagList(NIL,^t);
  238.   IF wp = NIL THEN
  239.      Error("Kann kein Fenster öffnen!!");
  240.   rp := wp^.RPort;
  241.   Hintergrund;
  242. again:
  243.   Inc(versuch);
  244.   IF versuch > 3 THEN
  245.   BEGIN
  246.      Write(f, datum+", "+zeit+": ");
  247.      Writeln(f,"Login von <"+usern+"> mit Passwort <"+passw+"> mißglückt!");
  248.      Close(f);
  249.      Delay(200);
  250.      forbid;
  251.      WHILE TRUE DO;
  252.   END;
  253.   SchreibeStuff;
  254.   Abfrage(usern,80,wp^.BorderTop+50,30,FALSE);
  255.   Abfrage(passw,80,wp^.BorderTop+60,30,TRUE);
  256.   Upper(usern);
  257.   Upper(passw);
  258.   GetDates;
  259.   FOR i := 1 TO anz DO
  260.   BEGIN
  261.      IF (usern = user[i].username) AND (passw = user[i].passwd) THEN
  262.      BEGIN
  263.        Write(f, datum+", "+zeit+": ");
  264.         Writeln(f, "Login von <"+usern+"> mit Passwort <"+passw+"> ok!");
  265.        EXIT;
  266.     END;
  267.   END;
  268.   GOTO again;
  269. END;
  270.  
  271. BEGIN
  272.   OpenLib(DOSBase, "dos.library", 37);
  273.   versuch := 0;
  274.   ReadInPasswds;
  275.   OpenLogFile;
  276.   win;
  277.   Close(f);
  278.   CloseWindow(wp);
  279.   UnLockPubScreen(NIL, ps);
  280. END.
  281.